package com.zhkc.iess.online.test01.service;

import com.zhkc.iess.online.test01.core.CPS;
import com.zhkc.iess.online.test01.core.HJ212Data;
import com.zhkc.iess.online.test01.dto.CN2011UploadedData;
import com.zhkc.iess.online.test01.dto.CN2031UploadedData;
import com.zhkc.iess.online.test01.dto.CN2051UploadedData;
import com.zhkc.iess.online.test01.dto.CN2061UploadedData;
import com.zhkc.iess.online.test01.handler.HJ212DataHandler;
import com.zhkc.wisdom.common.iot.service.IotDBService;
import io.netty.channel.ChannelHandlerContext;
import org.apache.iotdb.rpc.IoTDBConnectionException;
import org.apache.iotdb.rpc.StatementExecutionException;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 212请求处理service
 */
@Service
public class HJ212Service {

    @Autowired
    ObjectProvider<HJ212DataHandler> hj212DataHandler;
    @Autowired
    private IotDBService iotDBService;

    public void executeHandler(ChannelHandlerContext ctx, HJ212Data msg) {
        String CN = msg.getCN();

        System.out.println(msg);

        if ("9011".equals(CN)) {
            //自定义：暂时只处理 9011，逻辑：上位机主动发送命令给下位机，收到下位机的回复做出如下操作，从缓存里面取出上位机发送的信息，结合本次下位机返回的结果做出操作

            //请求应答结果
            //上传的报文有分包的话，每个具体的分包的CN也会不一样

        } else if ("2011".equals(CN)) {
            //上传污染物实时数据
            //现场机以上传污染物实时数据间隔为周期发送“污染物实时数据”；
            //上位机接收“上传污染物实时数据”命令并执行，根据标志 Flag 的值决定是否返回“数据应答”；
            //"-Rtd"
            //-Flag
            //-SampleTime
            //-EFlag
            CPS.CPSGroups parse = msg.getCps().new Parser().parseGroup("-Rtd", "-Flag", "-SampleTime", "-EFlag");
            String dataTime = parse.getInfos().get("DataTime");

            List<String> factors = new ArrayList<>();
            factors.add("c_w00000_rtd");
            factors.add("c_w00000_flag");
            factors.add("c_w01018_rtd");
            factors.add("c_w01018_flag");
            try {
                iotDBService.insertAlignedTabletBy212("device001.hour_data", String.valueOf(System.currentTimeMillis()),factors,parse.getGroups());
            } catch (IoTDBConnectionException e) {
                e.printStackTrace();
            } catch (StatementExecutionException e) {
                e.printStackTrace();
            }

            hj212DataHandler.ifAvailable(handler -> {
                handler.handleRealData(new CN2011UploadedData(dataTime, msg.getMN(), parse.getGroups()));
            });
        } else if ("2051".equals(CN)) {
            System.out.println(msg);
            //上传污染物分钟数据
            CPS.CPSGroups parse = msg.getCps().new Parser().parseGroup("-Cou", "-Min", "-Avg", "-Max", "-Flag");
            /*
               数据时间，表示一个时间段的开始时间点，时间精确到分钟；若分钟数据上
                报时间间隔取值为 10 分钟，则 20160801084000 表示上报数据为时间段 2016
                年 8 月 1 日 8 时 40 分 0 秒到 2016 年 8 月 1 日 8 时 50 分 0 秒之间的污染物分
                钟数据
             */
            String dataTime = parse.getInfos().get("DataTime");




            List<String> factors = new ArrayList<>();
            factors.add("c_w00000_rtd");
            factors.add("c_w00000_flag");
            factors.add("c_w01018_rtd");
            factors.add("c_w01018_flag");
            try {
                iotDBService.insertAlignedTabletBy212("device001.hour_data", String.valueOf(System.currentTimeMillis()),factors,parse.getGroups());
            } catch (IoTDBConnectionException e) {
                e.printStackTrace();
            } catch (StatementExecutionException e) {
                e.printStackTrace();
            }





            hj212DataHandler.ifAvailable(handler -> {
                handler.handleMinuteData(new CN2051UploadedData(dataTime, msg.getMN(), parse.getGroups()));
            });
        } else if ("2061".equals(CN)) {
            //HJ212 小时数据，无设置时间间隔，固定1小时
            //上传污染物小时数据
            CPS.CPSGroups parse = msg.getCps().new Parser().parseGroup("-Cou", "-Min", "-Avg", "-Max", "-Flag");
            String dataTime = parse.getInfos().get("DataTime");//时间精确到小时； 20160801080000
            hj212DataHandler.ifAvailable(handler -> {
                handler.handleHourData(new CN2061UploadedData(dataTime, msg.getMN(), parse.getGroups()));
            });
        } else if ("2031".equals(CN)) {
            //HJ212 日数据，无设置时间间隔，固定一天
            //上传污染物日历史数据
            CPS.CPSGroups parse = msg.getCps().new Parser().parseGroup("-Cou", "-Min", "-Avg", "-Max", "-Flag");
            String dataTime = parse.getInfos().get("DataTime");//数据时间，表示一个时间段的开始时间点，时间精确到日
            hj212DataHandler.ifAvailable(handler -> {
                handler.handleDayData(new CN2031UploadedData(dataTime, msg.getMN(), parse.getGroups()));
            });
        } else if ("2041".equals(CN)) {

        } else if ("3020".equals(CN)) {

        } else if ("2081".equals(CN)) {
            /*
            1、数采仪开机联网后发送“上传数采仪开机时间”命令；
2、上位机接收“上传数采仪开机时间”命令并执行，根据标志 Flag 的值决定是否返回“数据应答”；
3、如果“上传数采仪开机时间”命令需要数据应答，现场机接收“数据应答”，请求执行完毕
             */
        } else if ("3019".equals(CN)) {
            //1、在线监控（监测）仪器仪表发生更换时发送“上传设备唯一标识”命令
        }

    }

    //设置现场机时间
    private void setDeviceTime(ChannelHandlerContext ctx, HJ212Data msg){



    }
}
